home *** CD-ROM | disk | FTP | other *** search
/ SGI Developer Toolbox 6.1 / SGI Developer Toolbox 6.1 - Disc 4.iso / src / exampleCode / SciTex / examples / phong / trackball.h < prev   
Encoding:
C/C++ Source or Header  |  1994-08-02  |  4.9 KB  |  162 lines

  1. /******************************************************************************
  2.  *   trackball.h
  3.  ******************************************************************************
  4.  *
  5.  *  Purpose:
  6.  *      Descriptional text.
  7.  *
  8.  *  Authors:
  9.  *      Michael Teschner and Christian Henn
  10.  *
  11.  *  Note:
  12.  *      None.
  13.  *  
  14.  *  Revisions:
  15.  *      10.11.93    micha    Created file.
  16.  *
  17.  ******************************************************************************
  18.  *
  19.  *  COPYRIGHT (C)                  1992, 1993, 1994
  20.  *
  21.  *  BY  CHRISTIAN HENN             M.E. MUELLER-INSTITUTE FOR MICROSCOPY (MIM)
  22.  *      HENN@COMP.BIOZ.UNIBAS.CH   CH-4056 BASEL, SWITZERLAND   
  23.  *
  24.  *  AND MICHAEL WALDHERR-TESCHNER  SILICON GRAPHICS INDUSTRIES (SGI)
  25.  *      MICHA@BASEL.SGI.COM        CH-4125 RIEHEN, SWITZERLAND
  26.  *
  27.  ******************************************************************************
  28.  *
  29.  *  PERMISSION TO USE, COPY, MODIFY AND DISTRIBUTE THIS SOFTWARE AND ITS DOCU-
  30.  *  MENTATION FOR THE PURPOSE OF RESEARCH, DEVELOPMENT AND EDUCATION IS HEREBY
  31.  *  GRANTED FREE OF CHARGE, SUBJECT TO THE FOLLOWING RESTRICTIONS:
  32.  *
  33.  *  THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, EXPRESS,
  34.  *  IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF DESIGN,
  35.  *  MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, OR ARISING FROM A
  36.  *  COURSE OF DEALING, USAGE OR TRADE PRACTICE.
  37.  *
  38.  *  IN NO EVENT SHALL SILICON GRAPHICS OR THE M.E. MUELLER-INSTITUTE BE LIABLE
  39.  *  FOR ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
  40.  *  OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
  41.  *  WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
  42.  *  LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
  43.  *  THIS SOFTWARE.
  44.  *
  45.  ******************************************************************************
  46.  */
  47. /*
  48.  * Xtrackball.h
  49.  * A virtual trackball implementation
  50.  * Written by Gavin Bell for Silicon Graphics, November 1988.
  51.  *  
  52.  *  modified by Michael Teschner SGI Basel
  53.  *  1992
  54.  */
  55.  
  56. /*
  57.  * NOTE: If, for some reason, gl.h shouldn't be included, one could
  58.  * just define the Matrix type, like so:
  59.  * typedef float Matrix[4][4];
  60.  */
  61. #include <gl/gl.h>
  62.  
  63. /*
  64.  *    Pass the x and y coordinates of the last and current positions of
  65.  * the mouse, scaled so they are from (-1.0 ... 1.0).
  66.  *
  67.  * if ox,oy is the window's center and sizex,sizey is its size, then
  68.  * the proper transformation from screen coordinates (sc) to world
  69.  * coordinates (wc) is:
  70.  * wcx = (2.0 * (scx-ox)) / (float)sizex - 1.0
  71.  * wcy = (2.0 * (scy-oy)) / (float)sizey - 1.0
  72.  *
  73.  * For a really easy interface to this see 'ui.h'.
  74.  */
  75. void trackball(float *e, float p1x, float p1y, float p2x, float p2y);
  76.  
  77. /*
  78.  *    Given two sets of Euler paramaters, add them together to get an
  79.  * equivalent third set.  When incrementally adding them, the first
  80.  * argument here should be the new rotation, the secon and third the
  81.  * total rotation (which will be over-written with the resulting new
  82.  * total rotation).
  83.  */
  84. void add_eulers(float *e1, float *e2, float *dest);
  85.  
  86. /*
  87.  *    A useful function, builds a rotation matrix in Matrix based on
  88.  * given Euler paramaters.
  89.  */
  90. void build_rotmatrix(Matrix m, float *e);
  91.  
  92. /*
  93.  * This function computes the Euler paramaters given an xyz axis (the
  94.  * first argument, 3 floats) and angle (expressed in radians, the
  95.  * second argument).  The result is put into the third argument, which
  96.  * must be an array of 4 floats.
  97.  */
  98. void axis_to_euler(float *a, float phi, float *e);
  99.  
  100.  
  101. /** originally from vect.h **/
  102.  
  103. /*
  104.  *    Definition for vector math.  Vectors are just arrays of 3 floats.
  105.  */
  106.  
  107. #ifndef VECTDEF
  108. #define VECTDEF
  109.  
  110. #ifndef _POLY9
  111. #include <math.h>
  112. #endif
  113.  
  114. float *vnew(void);
  115. float *vclone(float *v);
  116. void  vcopy(float *v1, float *v2);
  117. void  vprint(float *v);
  118. void  vset(float *v, float x, float y, float z);
  119. void  vzero(float *v);
  120. void  vnormal(float *v);
  121. float vlength(float *v);
  122. void  vscale(float *v, float div);
  123. void  vmult(float *src1, float *src2, float *dst);
  124. void  vadd(float *src1, float *src2, float *dst);
  125. void  vsub(float *src1, float *src2, float *dst);
  126. void  vhalf(float *v1, float *v2, float *half);
  127. float vdot(float *v1, float *v2);
  128. void  vcross(float *v1, float *v2, float *cross);
  129. void  vdirection(float *v1, float *dir);
  130. void  vreflect(float *in, float *mirror, float *out);
  131. void  vmultmatrix(float m1[][4], float m2[][4], float prod[][4]);
  132. void  vtransform(float *v, float mat[][4], float *vt);
  133. #endif /*VECTDEF */
  134.  
  135. /**** extension by michael teschner ***/
  136.  
  137. /* was for GL */
  138.  
  139. long track_window;
  140.  
  141. float g_tx, g_ty, g_tz;
  142. long w_xsiz, w_ysiz, w_ox, w_oy, cx,cy;
  143.  
  144.  
  145. float or_x, or_y, or_z;
  146. float mat[4][4],spr[4],r[4];
  147. float rmat[4][4];
  148. float imat[4][4];
  149. float gr_sca ;
  150.  
  151. float p1x,p1y,p2x,p2y;    
  152. long omx,omy,nmx,nmy;
  153.  
  154. void trackball(float *r,float  p1x,float  p1y, float p2x, float p2y);
  155. void u_to_wo(long sx, long sy, float *wx, float *wy);
  156.  
  157. /* clipping planes */
  158.  
  159. float cp_xr, cp_yr, cp_tr, cp_dt;
  160.  
  161. /** new for mixed model -> X */
  162.